{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hello, Numerai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hello and welcome to the Numerai Data Science Tournament!\n",
    "\n",
    "This notebook is designed to help you build your first machine learning model and start competing the tournament. \n",
    "\n",
    "In this notebook we will\n",
    "1. Download and explore the Numerai dataset\n",
    "2. Train and evaluate your first machine learning model\n",
    "3. Deploy your model to start making live submissions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install dependencies\n",
    "!pip install -q numerapi pandas pyarrow matplotlib lightgbm scikit-learn cloudpickle scipy==1.10.1\n",
    "\n",
    "# Inline plots\n",
    "%matplotlib inline"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Dataset  \n",
    "\n",
    "At a high level, the Numerai dataset is a tabular dataset that describes the stock market over time. \n",
    "\n",
    "Each row represents a stock at a specific point in time, where `id` is the stock id and the `era` is the date. The `features` describe the attributes of the stock (eg. P/E ratio) known on the date and the `target` is a measure of 20-day returns.\n",
    "\n",
    "The unique thing about Numerai's dataset is that it is `obfuscated`, which means that the underlying stock ids, feature names, and target definitions are anonymized. This makes it so that we can give this data out for free and so that it can be modeled without any financial domain knowledge (or bias!)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Downloading the dataset\n",
    "Let's download the historical training data and take a closer look."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['v4.2/features.json',\n",
       " 'v4.2/live_example_preds.csv',\n",
       " 'v4.2/live_example_preds.parquet',\n",
       " 'v4.2/live_int8.parquet',\n",
       " 'v4.2/meta_model.parquet',\n",
       " 'v4.2/train_int8.parquet',\n",
       " 'v4.2/validation_example_preds.csv',\n",
       " 'v4.2/validation_example_preds.parquet',\n",
       " 'v4.2/validation_int8.parquet']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Initialize NumerAPI - the official Python API client for Numerai\n",
    "from numerapi import NumerAPI\n",
    "napi = NumerAPI()\n",
    "\n",
    "# Print all files available for download in the latest dataset\n",
    "[f for f in napi.list_datasets() if f.startswith(\"v4.2\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-10-05 18:00:29,049 INFO numerapi.utils: target file already exists\n",
      "2023-10-05 18:00:29,051 INFO numerapi.utils: starting download\n",
      "v4.2/train_int8.parquet: 3.77GB [01:55, 32.7MB/s]                   \n",
      "2023-10-05 18:02:24,855 INFO numerapi.utils: target file already exists\n",
      "2023-10-05 18:02:24,857 INFO numerapi.utils: download complete\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>era</th>\n",
       "      <th>feature_abating_unadaptable_weakfish</th>\n",
       "      <th>feature_ablest_mauritanian_elding</th>\n",
       "      <th>feature_acclimatisable_unfeigned_maghreb</th>\n",
       "      <th>feature_accommodable_crinite_cleft</th>\n",
       "      <th>feature_accretive_sorrier_skedaddle</th>\n",
       "      <th>feature_acetose_periotic_coronation</th>\n",
       "      <th>feature_additive_untrustworthy_hierologist</th>\n",
       "      <th>feature_adsorbed_blizzardy_burlesque</th>\n",
       "      <th>feature_affettuoso_taxidermic_greg</th>\n",
       "      <th>...</th>\n",
       "      <th>feature_wistful_tussive_cycloserine</th>\n",
       "      <th>feature_witchy_orange_muley</th>\n",
       "      <th>feature_wombed_liberatory_malva</th>\n",
       "      <th>feature_won_stalwart_eisenstein</th>\n",
       "      <th>feature_wrathful_prolix_colotomy</th>\n",
       "      <th>feature_wrinkliest_unmaintainable_usk</th>\n",
       "      <th>feature_wrought_muckier_temporality</th>\n",
       "      <th>feature_yelled_hysteretic_eath</th>\n",
       "      <th>feature_yoruban_unapplied_tawse</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n003bba8a98662e4</th>\n",
       "      <td>0001</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n003bee128c2fcfc</th>\n",
       "      <td>0001</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0048ac83aff7194</th>\n",
       "      <td>0001</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00691bec80d3e02</th>\n",
       "      <td>0001</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00b8720a2fdc4f2</th>\n",
       "      <td>0001</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc2d5e4b79a7ae</th>\n",
       "      <td>0573</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc7d24176548a4</th>\n",
       "      <td>0573</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc9844c1c7a6a9</th>\n",
       "      <td>0573</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffd79773f4109bb</th>\n",
       "      <td>0573</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff87b21e4db902</th>\n",
       "      <td>0573</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>606176 rows × 585 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                   era  feature_abating_unadaptable_weakfish  \\\n",
       "id                                                             \n",
       "n003bba8a98662e4  0001                                     0   \n",
       "n003bee128c2fcfc  0001                                     4   \n",
       "n0048ac83aff7194  0001                                     4   \n",
       "n00691bec80d3e02  0001                                     1   \n",
       "n00b8720a2fdc4f2  0001                                     0   \n",
       "...                ...                                   ...   \n",
       "nffc2d5e4b79a7ae  0573                                     4   \n",
       "nffc7d24176548a4  0573                                     0   \n",
       "nffc9844c1c7a6a9  0573                                     4   \n",
       "nffd79773f4109bb  0573                                     0   \n",
       "nfff87b21e4db902  0573                                     3   \n",
       "\n",
       "                  feature_ablest_mauritanian_elding  \\\n",
       "id                                                    \n",
       "n003bba8a98662e4                                  4   \n",
       "n003bee128c2fcfc                                  2   \n",
       "n0048ac83aff7194                                  4   \n",
       "n00691bec80d3e02                                  4   \n",
       "n00b8720a2fdc4f2                                  2   \n",
       "...                                             ...   \n",
       "nffc2d5e4b79a7ae                                  2   \n",
       "nffc7d24176548a4                                  3   \n",
       "nffc9844c1c7a6a9                                  1   \n",
       "nffd79773f4109bb                                  0   \n",
       "nfff87b21e4db902                                  3   \n",
       "\n",
       "                  feature_acclimatisable_unfeigned_maghreb  \\\n",
       "id                                                           \n",
       "n003bba8a98662e4                                         0   \n",
       "n003bee128c2fcfc                                         2   \n",
       "n0048ac83aff7194                                         2   \n",
       "n00691bec80d3e02                                         1   \n",
       "n00b8720a2fdc4f2                                         0   \n",
       "...                                                    ...   \n",
       "nffc2d5e4b79a7ae                                         4   \n",
       "nffc7d24176548a4                                         3   \n",
       "nffc9844c1c7a6a9                                         1   \n",
       "nffd79773f4109bb                                         1   \n",
       "nfff87b21e4db902                                         1   \n",
       "\n",
       "                  feature_accommodable_crinite_cleft  \\\n",
       "id                                                     \n",
       "n003bba8a98662e4                                   4   \n",
       "n003bee128c2fcfc                                   2   \n",
       "n0048ac83aff7194                                   0   \n",
       "n00691bec80d3e02                                   1   \n",
       "n00b8720a2fdc4f2                                   0   \n",
       "...                                              ...   \n",
       "nffc2d5e4b79a7ae                                   4   \n",
       "nffc7d24176548a4                                   4   \n",
       "nffc9844c1c7a6a9                                   2   \n",
       "nffd79773f4109bb                                   3   \n",
       "nfff87b21e4db902                                   1   \n",
       "\n",
       "                  feature_accretive_sorrier_skedaddle  \\\n",
       "id                                                      \n",
       "n003bba8a98662e4                                    2   \n",
       "n003bee128c2fcfc                                    2   \n",
       "n0048ac83aff7194                                    2   \n",
       "n00691bec80d3e02                                    2   \n",
       "n00b8720a2fdc4f2                                    2   \n",
       "...                                               ...   \n",
       "nffc2d5e4b79a7ae                                    3   \n",
       "nffc7d24176548a4                                    2   \n",
       "nffc9844c1c7a6a9                                    0   \n",
       "nffd79773f4109bb                                    1   \n",
       "nfff87b21e4db902                                    4   \n",
       "\n",
       "                  feature_acetose_periotic_coronation  \\\n",
       "id                                                      \n",
       "n003bba8a98662e4                                    0   \n",
       "n003bee128c2fcfc                                    3   \n",
       "n0048ac83aff7194                                    0   \n",
       "n00691bec80d3e02                                    0   \n",
       "n00b8720a2fdc4f2                                    0   \n",
       "...                                               ...   \n",
       "nffc2d5e4b79a7ae                                    1   \n",
       "nffc7d24176548a4                                    0   \n",
       "nffc9844c1c7a6a9                                    3   \n",
       "nffd79773f4109bb                                    4   \n",
       "nfff87b21e4db902                                    2   \n",
       "\n",
       "                  feature_additive_untrustworthy_hierologist  \\\n",
       "id                                                             \n",
       "n003bba8a98662e4                                           1   \n",
       "n003bee128c2fcfc                                           1   \n",
       "n0048ac83aff7194                                           4   \n",
       "n00691bec80d3e02                                           2   \n",
       "n00b8720a2fdc4f2                                           3   \n",
       "...                                                      ...   \n",
       "nffc2d5e4b79a7ae                                           0   \n",
       "nffc7d24176548a4                                           3   \n",
       "nffc9844c1c7a6a9                                           4   \n",
       "nffd79773f4109bb                                           1   \n",
       "nfff87b21e4db902                                           0   \n",
       "\n",
       "                  feature_adsorbed_blizzardy_burlesque  \\\n",
       "id                                                       \n",
       "n003bba8a98662e4                                     4   \n",
       "n003bee128c2fcfc                                     3   \n",
       "n0048ac83aff7194                                     1   \n",
       "n00691bec80d3e02                                     1   \n",
       "n00b8720a2fdc4f2                                     1   \n",
       "...                                                ...   \n",
       "nffc2d5e4b79a7ae                                     4   \n",
       "nffc7d24176548a4                                     1   \n",
       "nffc9844c1c7a6a9                                     0   \n",
       "nffd79773f4109bb                                     2   \n",
       "nfff87b21e4db902                                     1   \n",
       "\n",
       "                  feature_affettuoso_taxidermic_greg  ...  \\\n",
       "id                                                    ...   \n",
       "n003bba8a98662e4                                   0  ...   \n",
       "n003bee128c2fcfc                                   2  ...   \n",
       "n0048ac83aff7194                                   3  ...   \n",
       "n00691bec80d3e02                                   2  ...   \n",
       "n00b8720a2fdc4f2                                   0  ...   \n",
       "...                                              ...  ...   \n",
       "nffc2d5e4b79a7ae                                   4  ...   \n",
       "nffc7d24176548a4                                   3  ...   \n",
       "nffc9844c1c7a6a9                                   0  ...   \n",
       "nffd79773f4109bb                                   0  ...   \n",
       "nfff87b21e4db902                                   2  ...   \n",
       "\n",
       "                  feature_wistful_tussive_cycloserine  \\\n",
       "id                                                      \n",
       "n003bba8a98662e4                                    4   \n",
       "n003bee128c2fcfc                                    3   \n",
       "n0048ac83aff7194                                    0   \n",
       "n00691bec80d3e02                                    0   \n",
       "n00b8720a2fdc4f2                                    3   \n",
       "...                                               ...   \n",
       "nffc2d5e4b79a7ae                                    4   \n",
       "nffc7d24176548a4                                    2   \n",
       "nffc9844c1c7a6a9                                    1   \n",
       "nffd79773f4109bb                                    2   \n",
       "nfff87b21e4db902                                    3   \n",
       "\n",
       "                  feature_witchy_orange_muley  \\\n",
       "id                                              \n",
       "n003bba8a98662e4                            0   \n",
       "n003bee128c2fcfc                            3   \n",
       "n0048ac83aff7194                            0   \n",
       "n00691bec80d3e02                            2   \n",
       "n00b8720a2fdc4f2                            1   \n",
       "...                                       ...   \n",
       "nffc2d5e4b79a7ae                            4   \n",
       "nffc7d24176548a4                            2   \n",
       "nffc9844c1c7a6a9                            1   \n",
       "nffd79773f4109bb                            2   \n",
       "nfff87b21e4db902                            1   \n",
       "\n",
       "                  feature_wombed_liberatory_malva  \\\n",
       "id                                                  \n",
       "n003bba8a98662e4                                0   \n",
       "n003bee128c2fcfc                                3   \n",
       "n0048ac83aff7194                                1   \n",
       "n00691bec80d3e02                                1   \n",
       "n00b8720a2fdc4f2                                1   \n",
       "...                                           ...   \n",
       "nffc2d5e4b79a7ae                                1   \n",
       "nffc7d24176548a4                                0   \n",
       "nffc9844c1c7a6a9                                3   \n",
       "nffd79773f4109bb                                4   \n",
       "nfff87b21e4db902                                2   \n",
       "\n",
       "                  feature_won_stalwart_eisenstein  \\\n",
       "id                                                  \n",
       "n003bba8a98662e4                                2   \n",
       "n003bee128c2fcfc                                2   \n",
       "n0048ac83aff7194                                2   \n",
       "n00691bec80d3e02                                2   \n",
       "n00b8720a2fdc4f2                                2   \n",
       "...                                           ...   \n",
       "nffc2d5e4b79a7ae                                2   \n",
       "nffc7d24176548a4                                2   \n",
       "nffc9844c1c7a6a9                                0   \n",
       "nffd79773f4109bb                                1   \n",
       "nfff87b21e4db902                                1   \n",
       "\n",
       "                  feature_wrathful_prolix_colotomy  \\\n",
       "id                                                   \n",
       "n003bba8a98662e4                                 4   \n",
       "n003bee128c2fcfc                                 0   \n",
       "n0048ac83aff7194                                 0   \n",
       "n00691bec80d3e02                                 2   \n",
       "n00b8720a2fdc4f2                                 0   \n",
       "...                                            ...   \n",
       "nffc2d5e4b79a7ae                                 1   \n",
       "nffc7d24176548a4                                 4   \n",
       "nffc9844c1c7a6a9                                 3   \n",
       "nffd79773f4109bb                                 2   \n",
       "nfff87b21e4db902                                 2   \n",
       "\n",
       "                  feature_wrinkliest_unmaintainable_usk  \\\n",
       "id                                                        \n",
       "n003bba8a98662e4                                      2   \n",
       "n003bee128c2fcfc                                      2   \n",
       "n0048ac83aff7194                                      2   \n",
       "n00691bec80d3e02                                      2   \n",
       "n00b8720a2fdc4f2                                      2   \n",
       "...                                                 ...   \n",
       "nffc2d5e4b79a7ae                                      3   \n",
       "nffc7d24176548a4                                      2   \n",
       "nffc9844c1c7a6a9                                      0   \n",
       "nffd79773f4109bb                                      0   \n",
       "nfff87b21e4db902                                      2   \n",
       "\n",
       "                  feature_wrought_muckier_temporality  \\\n",
       "id                                                      \n",
       "n003bba8a98662e4                                    4   \n",
       "n003bee128c2fcfc                                    2   \n",
       "n0048ac83aff7194                                    3   \n",
       "n00691bec80d3e02                                    3   \n",
       "n00b8720a2fdc4f2                                    0   \n",
       "...                                               ...   \n",
       "nffc2d5e4b79a7ae                                    2   \n",
       "nffc7d24176548a4                                    0   \n",
       "nffc9844c1c7a6a9                                    2   \n",
       "nffd79773f4109bb                                    1   \n",
       "nfff87b21e4db902                                    3   \n",
       "\n",
       "                  feature_yelled_hysteretic_eath  \\\n",
       "id                                                 \n",
       "n003bba8a98662e4                               2   \n",
       "n003bee128c2fcfc                               3   \n",
       "n0048ac83aff7194                               1   \n",
       "n00691bec80d3e02                               2   \n",
       "n00b8720a2fdc4f2                               1   \n",
       "...                                          ...   \n",
       "nffc2d5e4b79a7ae                               2   \n",
       "nffc7d24176548a4                               1   \n",
       "nffc9844c1c7a6a9                               0   \n",
       "nffd79773f4109bb                               0   \n",
       "nfff87b21e4db902                               0   \n",
       "\n",
       "                  feature_yoruban_unapplied_tawse  target  \n",
       "id                                                         \n",
       "n003bba8a98662e4                                2    0.25  \n",
       "n003bee128c2fcfc                                2    0.75  \n",
       "n0048ac83aff7194                                2    0.25  \n",
       "n00691bec80d3e02                                2    0.75  \n",
       "n00b8720a2fdc4f2                                2    0.50  \n",
       "...                                           ...     ...  \n",
       "nffc2d5e4b79a7ae                                1    0.25  \n",
       "nffc7d24176548a4                                2    0.50  \n",
       "nffc9844c1c7a6a9                                1    0.50  \n",
       "nffd79773f4109bb                                1    0.50  \n",
       "nfff87b21e4db902                                1    0.50  \n",
       "\n",
       "[606176 rows x 585 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import json\n",
    "\n",
    "# Download the training data and feature metadata\n",
    "# This will take a few minutes 🍵\n",
    "napi.download_dataset(\"v4.2/train_int8.parquet\");\n",
    "napi.download_dataset(\"v4.2/features.json\");\n",
    "\n",
    "# Load only the \"medium\" feature set to reduce memory usage and speedup model training (required for Colab free tier)\n",
    "# Use the \"all\" feature set to use all features \n",
    "feature_metadata = json.load(open(\"v4.2/features.json\"))\n",
    "feature_cols = feature_metadata[\"feature_sets\"][\"medium\"]\n",
    "train = pd.read_parquet(\"v4.2/train_int8.parquet\", columns=[\"era\"] + feature_cols + [\"target\"])\n",
    "\n",
    "# Downsample to every 4th era to reduce memory usage and speedup model training (suggested for Colab free tier)\n",
    "# Comment out the line below to use all the data \n",
    "train = train[train[\"era\"].isin(train[\"era\"].unique()[::4])]\n",
    "train"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Eras\n",
    "As mentioned above, each `era` corresponds to a different date. Each era is exactly 1 week apart.\n",
    "\n",
    "It is helpful to think about rows of stocks within the same `era` as a single example. You will notice that throughout this notebook and other examples, we often talk about things \"per era\". For example, the number of rows per era represents the number of stocks in Numerai's investable universe on that date."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the number of rows per era\n",
    "train.groupby(\"era\").size().plot(title=\"Number of rows per era\", figsize=(5, 3), xlabel=\"Era\");"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Features\n",
    "As mentioned above, `features` are quantitative attributes of each stock: fundamentals like P/E ratio, technical signals like RSI, market data like short interest, secondary data like analyst ratings, and much more. \n",
    "\n",
    "The underlying definition of each feature is not important, just know that Numerai has included these features in the dataset because we believe they are predictive of the `target`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "583"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Number of features \n",
    "len(feature_cols)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Feature values are binned into 5 equal bins: `0`, `1`, `2`, `3`, `4`. This heavy regularization of feature values is to avoid overfitting as the underlying values are extremely noisy.\n",
    "\n",
    "If data for a particular feature is missing for that era (more common in early `eras`), then all values will be set to `2`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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puXa7m9169ZN3bp109/+9jetXLlSI0aMUGJiosUpKgCA8mvWrJleeOEFvfDCCzp06JA6dOig2bNn68MPPzTPqahjcpMmTVRUVKQjR45YnM1w+PDhUq+/b98+GYZh8SHejb1z7969OnjwoN5//32NHDnSPL558+Zi27zZh4H/+Mc/5Obmpk2bNln85EZ8fHypakX1xKl6qFZuvFW2JH3//ff65z//qX79+t3yR15DQkLUrFkzvfnmm8rNzb3ptp2dnRUeHq5169YpPT3d/Py///1vbdq0yWIdT09P1a9fXzt27LAYX7hwYbHtOzs7F/tU7+23377l6YWlcf1Wrb/dpiQNGDCgXNuVfj1948aar39bx+l6AGA/ly5dKvZTEs2aNZOHh4f5eFvRx+Tr1/He2MOu9xVrBg4cqFOnTlncEvzSpUt65513LOZd/+brt/tiGIbmz59fbJu1a9eWVPwDSmdnZ5lMJoseevToUa1bt65UtaJ64hsnVCvDhg2Tu7u7unfvLl9fX/3444965513VKtWLc2cOfOW6zo5OWnp0qUaMGCA7r77bo0ePVqNGjXSyZMntXXrVnl6eurTTz+VJE2fPl0bN25Uz5499dxzz+natWt6++23dffdd+uHH36w2O6TTz6pmTNn6sknn1SnTp20Y8cOHTx4sNjr/8///I8++OADeXl5qU2bNkpOTtYXX3whHx+fcr0nR44c0UMPPaT+/fsrOTlZH374oR5//HG1b9++XNuVpPfff18LFy7Uww8/rGbNmunixYt699135enpqYEDB5Z7+wCAXx08eFB9+/bVo48+qjZt2qhGjRpau3atsrKy9Nhjj0mq+GNySEiIIiMjNW/ePJ07d858O/LrPc3aqeBPPfWUFixYoJEjRyo1NVUBAQH64IMPiv3cRqtWrdSsWTNNnjxZJ0+elKenp/7xj3+UeA1YSEiIJOn5559XeHi4nJ2d9dhjj2nQoEGaM2eO+vfvr8cff1ynT59WXFycmjdvXqxPA9cRnFCtREREaMWKFZozZ45ycnLUoEEDDR06VNOmTSvVxau9e/dWcnKyZsyYoQULFig3N1f+/v7q2rWrnnnmGfO8du3aadOmTYqJidHUqVMVGBio6dOnKyMjo9gBeerUqTpz5ozWrFmjVatWacCAAdqwYYN8fX0t5s2fP1/Ozs5asWKF8vPz1aNH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atWqpXbt2umLL76w2AYAAJL9etXp06c1cuRIZWRkyMvLS+3atdOmTZv04IMPSpLmzp0rJycnRUZGqqCgQOHh4Vq4cKG9dgMAcJuwKTjt3LlTW7du1YYNG3T33XerZs2aFs9//PHHpdpO7969ZRjGTZ9PSEiwWH7ppZf00ksvlbleAED1Y69etWzZsls+7+bmpri4uDL/mDsAoGqxKTjVrVtXDz/8sL1rAQDAbuhVAAB7sik4xcfH27sOAADsil4FALAnJ1tXvHbtmr744gstWbJEFy9elCSdOnVKubm5disOAIDyoFcBAOzFpm+cjh07pv79+ys9PV0FBQV68MEH5eHhoddff10FBQVavHixvesEAKBM6FUAAHuy6RunCRMmqFOnTjp//rzc3d3N4w8//LCSkpLsVhwAALaiVwEA7Mmmb5y+/PJL7dq1Sy4uLhbjTZs21cmTJ+1SGAAA5UGvAgDYk03fOBUVFamwsLDY+IkTJ+Th4VHuogAAKC96FQDAnmwKTv369dO8efPMyyaTSbm5uZo2bZoGDhxor9oAALAZvQoAYE82nao3e/ZshYeHq02bNsrPz9fjjz+uQ4cOqX79+vr73/9u7xoBACgzehUAwJ5sCk6BgYH6/vvvlZiYqB9++EG5ubkaO3asRowYYXEBLgAAjkKvAgDYk03BSZJq1KihJ554wp61AABgV/QqAIC92BScli9ffsvnR44caVMxAADYC70KAGBPNgWnCRMmWCxfvXpVly5dkouLi2rVqkUzAgA4HL0KAGBPNt1V7/z58xaP3NxcHThwQPfddx8X3AIAbgv0KgCAPdkUnErSokULzZw5s9gnfAAA3C7oVQAAW9ktOEm/XoR76tQpe24SAAC7olcBAGxh0zVO//znPy2WDcNQRkaGFixYoB49etilMAAAyoNeBQCwJ5uCU0REhMWyyWRSgwYN1KdPH82ePdsedQEAUC70KgCAPdkUnIqKiuxdBwAAdkWvAgDYk12vcQIAAACAO5FN3zjFxMSUeu6cOXNseQkAAMqFXgUAsCebgtN3332n7777TlevXlXLli0lSQcPHpSzs7M6duxonmcymexTJQAAZUSvAgDYk03BafDgwfLw8ND777+vevXqSfr1hwZHjx6tnj176oUXXrBrkQAAlBW9CgBgTzZd4zR79mzFxsaaG5Ek1atXT6+99hp3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",
      "text/plain": [
       "<Figure size 1000x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 3))\n",
    "first_era = train[train[\"era\"] == train[\"era\"].unique()[0]]\n",
    "last_era = train[train[\"era\"] == train[\"era\"].unique()[-1]]\n",
    "last_era[feature_cols[-1]].plot(kind=\"hist\", title=\"5 equal bins\", density=True, bins=50, ax=ax1);\n",
    "first_era[feature_cols[-1]].plot(kind=\"hist\", title=\"missing data\", density=True, bins=50, ax=ax2);"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Target\n",
    "The `target` is a measure of 20-day stock market returns. Specifically, it is a measure of \"stock-specific\" returns that are not \"explained\" by broader trends in the market, country, sector, or well-known \"factors\".\n",
    "\n",
    "Target values are binned into 5 unequal bins: `0`, `0.25`, `0.5`, `0.75`, `1.0`. Again, this heavy regularization of target values is to avoid overfitting as the underlying values are extremely noisy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mQ7r6enpCgsL08GDB3X33XfbxwMCAhQeHu7ueACAesirrjEWFBRIkkJDQx3G16xZo2bNmqlr166aO3euLl++XOU+SktLVVhY6LAAAHCjvOYN/jabTbNmzVK/fv3UtWtX+/j48ePVunVrRUZG6siRI/rNb36jrKwsbdiwodL9pKam6rnnnnNXbKDWaPP0R1U+dmLhfW5MAng3r/k+xscee0wff/yxPvnkk+t+jt327ds1ZMgQZWdnKyYmpsLjpaWlKi0tta9f+xiggoICPvkG9RrFiPqssLBQISEhN9QFXnHE+MQTT+jDDz/U7t27f/bDXfv06SNJVRaj1WqV1WqtkZwAgLrPo8VoGIZmzJih9957Tzt37lR0dPTPPufw4cOSpIiIiBpOBwCojzxajElJSVq7dq3+9re/KSgoSPn5+ZKkkJAQ+fv7KycnR2vXrtWwYcN0yy236MiRI5o9e7buvvtude/e3ZPRAQB1lEeLccWKFZJ+fBO/WVpamqZMmSI/Pz9t3bpVS5cuVXFxsaKiojRmzBjNnz/fA2kBAPWBx0+lXk9UVJR27drlpjQAAHjZ+xgBAPA0ihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE4oRAAATihEAABOKEQAAE48WY2pqqu68804FBQUpLCxMo0aNUlZWlsM2JSUlSkpK0i233KLAwECNGTNG586d81BiAEBd59Fi3LVrl5KSknTgwAFt2bJFZWVluvfee1VcXGzfZvbs2frggw+0fv167dq1S2fPntXo0aM9mBoAUJf5evLFMzMzHdbT09MVFhamgwcP6u6771ZBQYHeeustrV27VoMHD5YkpaWlqVOnTjpw4ID+4z/+wxOxAQB1mFddYywoKJAkhYaGSpIOHjyosrIyDR061L5Nx44d1apVK+3fv7/SfZSWlqqwsNBhAQDgRnlNMdpsNs2aNUv9+vVT165dJUn5+fny8/NTkyZNHLZt0aKF8vPzK91PamqqQkJC7EtUVFRNRwcA1CFeU4xJSUn66quvlJGRcVP7mTt3rgoKCuzL6dOnXZQQAFAfePQa4zVPPPGEPvzwQ+3evVu33nqrfTw8PFxXrlzRxYsXHY4az507p/Dw8Er3ZbVaZbVaazoyAKCO8ugRo2EYeuKJJ/Tee+9p+/btio6Odng8NjZWDRs21LZt2+xjWVlZOnXqlPr27evuuACAesCjR4xJSUlau3at/va3vykoKMh+3TAkJET+/v4KCQlRYmKikpOTFRoaquDgYM2YMUN9+/bljlQAQI3waDGuWLFCkjRo0CCH8bS0NE2ZMkWS9Oqrr6pBgwYaM2aMSktLFRcXp9dff93NSQEA9YVHi9EwjJ/dplGjRlq+fLmWL1/uhkQAgPrOa+5KBQDAG1CMAACYUIwAAJhQjAAAmFCMAACYUIwAAJhQjAAAmFCMAACYUIwAAJhQjAAAmFCMAACYUIwAAJhQjAAAmFCMAACYUIwAAJhQjAAAmFCMAACYUIwAAJhQjAAAmFCMAACYUIwAAJg4VYzHjx93dQ4AALyCU8XYrl073XPPPfrLX/6ikpISV2cCAMBjnCrGL774Qt27d1dycrLCw8M1ffp0ffbZZ67OBgCA2zlVjD169NBrr72ms2fPatWqVcrLy1P//v3VtWtXLVmyROfPn3d1TgAA3OKmbr7x9fXV6NGjtX79er300kvKzs7WnDlzFBUVpUmTJikvL89VOQEAcIubKsbPP/9cjz/+uCIiIrRkyRLNmTNHOTk52rJli86ePauRI0e6KicAAG7h68yTlixZorS0NGVlZWnYsGFavXq1hg0bpgYNfuzZ6Ohopaenq02bNq7MCgBAjXOqGFesWKGHH35YU6ZMUURERKXbhIWF6a233rqpcAAAuJtTxXjs2LGf3cbPz0+TJ092ZvcAAHiMU9cY09LStH79+grj69ev19tvv33ToQAA8BSnijE1NVXNmjWrMB4WFqYXX3zxpkMBAOApThXjqVOnFB0dXWG8devWOnXq1E2HAgDAU5wqxrCwMB05cqTC+Jdffqlbbrnlhveze/duDR8+XJGRkbJYLNq4caPD41OmTJHFYnFY4uPjnYkMAMANcaoYx40bp1/96lfasWOHysvLVV5eru3bt2vmzJl68MEHb3g/xcXFuv3227V8+fIqt4mPj1deXp59WbdunTORAQC4IU7dlbpgwQKdOHFCQ4YMka/vj7uw2WyaNGlSta4xJiQkKCEh4brbWK1WhYeHOxMTAIBqc6oY/fz89M4772jBggX68ssv5e/vr27duql169auzqedO3cqLCxMTZs21eDBg/XCCy9c93RtaWmpSktL7euFhYUuzwQAqLucKsZrOnTooA4dOrgqSwXx8fEaPXq0oqOjlZOTo9/+9rdKSEjQ/v375ePjU+lzUlNT9dxzz9VYJgBA3eZUMZaXlys9PV3btm3Tv/71L9lsNofHt2/f7pJw5uuV3bp1U/fu3RUTE6OdO3dqyJAhlT5n7ty5Sk5Otq8XFhYqKirKJXkAAHWfU8U4c+ZMpaen67777lPXrl1lsVhcnatSbdu2VbNmzZSdnV1lMVqtVlmtVrfkAQDUPU4VY0ZGht59910NGzbM1Xmu68yZM/ruu++q/HxWAABultM337Rr1+6mX7yoqEjZ2dn29dzcXB0+fFihoaEKDQ3Vc889pzFjxig8PFw5OTl66qmn1K5dO8XFxd30awMAUBmn3sf461//Wq+99poMw7ipF//88891xx136I477pAkJScn64477tAzzzwjHx8fHTlyRCNGjFCHDh2UmJio2NhY7dmzh1OlAIAa49QR4yeffKIdO3bo448/VpcuXdSwYUOHxzds2HBD+xk0aNB1y3Xz5s3OxAMAwGlOFWOTJk10//33uzoLAAAe51QxpqWluToHAABewalrjJJ09epVbd26VX/605906dIlSdLZs2dVVFTksnAAALibU0eMJ0+eVHx8vE6dOqXS0lL94he/UFBQkF566SWVlpZq5cqVrs4JAIBbOHXEOHPmTPXq1Uvff/+9/P397eP333+/tm3b5rJwAAC4m1NHjHv27NG+ffvk5+fnMN6mTRt9++23LgkGAIAnOHXEaLPZVF5eXmH8zJkzCgoKuulQAAB4ilPFeO+992rp0qX2dYvFoqKiIqWkpLj9Y+IAAHAlp06lLl68WHFxcercubNKSko0fvx4HTt2TM2aNdO6detcnREAALdxqhhvvfVWffnll8rIyNCRI0dUVFSkxMREPfTQQw434wAAUNs4/UXFvr6+mjBhgiuzAADgcU4V4+rVq6/7+KRJk5wKAwCApzn9RcVmZWVlunz5svz8/BQQEEAxAgBqLafuSv3+++8dlqKiImVlZal///7cfAMAqNWc/qzUn2rfvr0WLlxY4WgSAIDaxGXFKP14Q87Zs2dduUsA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",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot density histogram of the target\n",
    "train[\"target\"].plot(kind=\"hist\", title=\"Target\", figsize=(5, 3), xlabel=\"Value\", density=True, bins=50);"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Modeling\n",
    "At a high level, our task is to model and predict the `target` variable.\n",
    "\n",
    "### Model training\n",
    "\n",
    "You are free to use any tool or framework, but here we will be using LGBMRegressor, a popular choice amongst tournament participants.\n",
    "\n",
    "While you wait for the model to train, watch this [video](https://www.youtube.com/watch?v=w8Y7hY05z7k) to learn why tree-based models work so well on tabular datasets from our Chief Scientist MDO."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] Accuracy may be bad since you didn't explicitly set num_leaves OR 2^max_depth > num_leaves. (num_leaves=31).\n",
      "[LightGBM] [Warning] Accuracy may be bad since you didn't explicitly set num_leaves OR 2^max_depth > num_leaves. (num_leaves=31).\n",
      "[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.010228 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[LightGBM] [Info] Total Bins 2915\n",
      "[LightGBM] [Info] Number of data points in the train set: 606176, number of used features: 583\n",
      "[LightGBM] [Info] Start training from score 0.499979\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n"
     ]
    }
   ],
   "source": [
    "# https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html \n",
    "import lightgbm as lgb\n",
    "\n",
    "# https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html\n",
    "model = lgb.LGBMRegressor(\n",
    "  n_estimators=2000,\n",
    "  learning_rate=0.01,\n",
    "  max_depth=5,\n",
    "  num_leaves=2**5-1,\n",
    "  colsample_bytree=0.1\n",
    ")\n",
    "\n",
    "# This will take a few minutes 🍵\n",
    "model.fit(\n",
    "  train[feature_cols],\n",
    "  train[\"target\"]\n",
    ");"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validation predictions\n",
    "\n",
    "Now let's make some out-of-sample predictions on the validation dataset to evaluate our model's performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-10-05 18:03:18,603 INFO numerapi.utils: target file already exists\n",
      "2023-10-05 18:03:18,605 INFO numerapi.utils: starting download\n",
      "v4.2/validation_int8.parquet: 4.32GB [02:12, 32.5MB/s]                            \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] Accuracy may be bad since you didn't explicitly set num_leaves OR 2^max_depth > num_leaves. (num_leaves=31).\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>era</th>\n",
       "      <th>prediction</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n002a15bc5575bbb</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.505760</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00309caaa0f955e</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.508122</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00576b397182463</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.496882</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00633405d59c6a1</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.505887</td>\n",
       "      <td>1.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n008c2eefc8911c7</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.496598</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffbff863fda39c0</th>\n",
       "      <td>1075</td>\n",
       "      <td>0.499023</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc82515639b94b</th>\n",
       "      <td>1075</td>\n",
       "      <td>0.495480</td>\n",
       "      <td>1.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffdec192817eb70</th>\n",
       "      <td>1075</td>\n",
       "      <td>0.507814</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffee7d676790c81</th>\n",
       "      <td>1075</td>\n",
       "      <td>0.504296</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff87ed96077590</th>\n",
       "      <td>1075</td>\n",
       "      <td>0.464856</td>\n",
       "      <td>0.75</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>637771 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                   era  prediction  target\n",
       "id                                        \n",
       "n002a15bc5575bbb  0579    0.505760    0.25\n",
       "n00309caaa0f955e  0579    0.508122    0.50\n",
       "n00576b397182463  0579    0.496882    0.50\n",
       "n00633405d59c6a1  0579    0.505887    1.00\n",
       "n008c2eefc8911c7  0579    0.496598    0.50\n",
       "...                ...         ...     ...\n",
       "nffbff863fda39c0  1075    0.499023    0.50\n",
       "nffc82515639b94b  1075    0.495480    1.00\n",
       "nffdec192817eb70  1075    0.507814    0.50\n",
       "nffee7d676790c81  1075    0.504296    0.50\n",
       "nfff87ed96077590  1075    0.464856    0.75\n",
       "\n",
       "[637771 rows x 3 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Download validation data \n",
    "# This will take a few minutes 🍵\n",
    "napi.download_dataset(\"v4.2/validation_int8.parquet\");\n",
    "\n",
    "# Load the validation data, filtering for data_type == \"validation\"\n",
    "validation = pd.read_parquet(\"v4.2/validation_int8.parquet\", columns=[\"era\", \"data_type\"] + feature_cols + [\"target\"]) \n",
    "validation = validation[validation[\"data_type\"] == \"validation\"]\n",
    "del validation[\"data_type\"]\n",
    "\n",
    "# Downsample to every 4th era to reduce memory usage and speedup evaluation (suggested for Colab free tier)\n",
    "# Comment out the line below to use all the data (higher memory usage, slower inference, more accurate evaluation)\n",
    "validation = validation[validation[\"era\"].isin(validation[\"era\"].unique()[::4])]\n",
    "\n",
    "# Eras are 1 week apart, but targets look 4 weeks into the future, so we need to \"embargo\" the 4 eras following our last train era to avoid data leakage. \n",
    "last_train_era = int(train[\"era\"].unique()[-1])\n",
    "eras_to_embargo = [str(era).zfill(4) for era in [last_train_era + i for i in range(4)]]\n",
    "validation = validation[~validation[\"era\"].isin(eras_to_embargo)]\n",
    "\n",
    "# Generate predictions against the out-of-sample validation features\n",
    "# This will take a few minutes 🍵\n",
    "validation[\"prediction\"] = model.predict(validation[feature_cols])\n",
    "validation[[\"era\", \"prediction\", \"target\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Performance evaluation\n",
    "The primary scoring metric in Numerai is called `numerai_corr` or `CORR`, which is a Numerai specific variant of the Pearson Correlation Coefficient. \n",
    "\n",
    "This metric is designed to \"align incentives\" between model and hedge fund performance. A model with a good `CORR` score should help the hedge fund make good returns.\n",
    "\n",
    "On the Numerai website you will also see this score referred to as `CORR20V2`, where the \"20\" refers to the 20-day return target and \"v2\" specifies that we are using the 2nd version of the scoring function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import stats\n",
    "import numpy as np\n",
    "\n",
    "# Numerai's primary scoring metric\n",
    "def numerai_corr(preds, target):\n",
    "    # rank (keeping ties) then gaussianize predictions to standardize prediction distributions\n",
    "    ranked_preds = (preds.rank(method=\"average\").values - 0.5) / preds.count()\n",
    "    gauss_ranked_preds = stats.norm.ppf(ranked_preds)\n",
    "    # center targets around 0\n",
    "    centered_target = target - target.mean()\n",
    "    # raise both preds and target to the power of 1.5 to accentuate the tails\n",
    "    preds_p15 = np.sign(gauss_ranked_preds) * np.abs(gauss_ranked_preds) ** 1.5\n",
    "    target_p15 = np.sign(centered_target) * np.abs(centered_target) ** 1.5\n",
    "    # finally return the Pearson correlation\n",
    "    return np.corrcoef(preds_p15, target_p15)[0, 1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As mentioned above, it is important for us to score each historical `era` independantly. So when evaluating the performance of our model, we should be looking at the \"per era\" `corr`.\n",
    "\n",
    "One thing you may notice here is how low the scores are (in the range of +/- 5% correlation). This is very normal in the domain of quantitative finance and is part of the reason why we say Numerai is the \"hardest data science tournament\" in the world."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAILCAYAAADfQszqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABF6klEQVR4nO3deVxVdf7H8Tf7ooCiCO5bTGCaJqZBlpYUmmWamjo2Ljk6LVRKWWquLcNMi2lpWTNpmZGOWrboT1NSK6VU1Mw9TUVBQCVA2eHe3x+Od7oBHiwvh+X1fDzuo873fL/3fL6A4vuec77HyWq1WgUAAAAAKJez2QUAAAAAQFVHcAIAAAAAAwQnAAAAADBAcAIAAAAAAwQnAAAAADBAcAIAAAAAAwQnAAAAADBAcAIAAAAAAwQnAAAAADBAcAKAWuT48eNycnLSe++9Z2ubOXOmnJycKjTeyclJM2fOvKo19ezZUz179ryq71lTbdq0SU5OTtq0adNVfV9HfF8BoKYhOAFAFdWvXz95e3vr/Pnz5fYZPny43N3dde7cuUqs7Mrt379fM2fO1PHjx80upZS0tDQ99dRTCgkJkbe3t+rUqaOwsDC98MILyszMNLu8q2bNmjWEIwD4AwhOAFBFDR8+XHl5efrkk0/K3J+bm6tPP/1UvXv3VoMGDX73caZOnaq8vLzfPb4i9u/fr1mzZpUZnL788kt9+eWXDj1+ebZv36727dtr/vz5uuWWWzR79my9+uqruuGGG/SPf/xD999/vyl1OcKaNWs0a9asMvfl5eVp6tSplVwRAFQvrmYXAAAoW79+/eTj46O4uDiNGDGi1P5PP/1UOTk5Gj58+B86jqurq1xdzft14O7ubspxMzMzNWDAALm4uGjXrl0KCQmx2//iiy/qX//611U5Vm5urry9vUu1FxcXy2KxmPY1uMTT09PU4wNAdcAZJwCoory8vHTfffcpPj5e6enppfbHxcXJx8dH/fr1U0ZGhp566il16NBBdevWla+vr/r06aMffvjB8Dhl3eNUUFCgCRMmKCAgwHaMU6dOlRp74sQJPfLII7r22mvl5eWlBg0aaPDgwXZnlt577z0NHjxYknTbbbfJycnJ7j6dsu5xSk9P15gxYxQYGChPT0917NhR77//vl2fS/drvfLKK3rnnXfUtm1beXh46MYbb9T27dsN5/32228rOTlZs2fPLhWaJCkwMLDUWZg333xT1113nTw8PNSkSRM9+uijpS7n69mzp9q3b6/ExETdeuut8vb21pQpU+zqnTNnjq3e/fv3S5IOHjyoQYMGyd/fX56enurSpYs+++wzw3l88803Gjx4sFq0aCEPDw81b95cEyZMsDuLOGrUKM2fP1+SbF//X3/Py7rHadeuXerTp498fX1Vt25d9erVS999951dn/fee09OTk7asmWLYmJiFBAQoDp16mjAgAE6c+aMYe0AUJ1wxgkAqrDhw4fr/fff13/+8x9FR0fb2jMyMrRu3ToNGzZMXl5e2rdvn1atWqXBgwerdevWSktL09tvv60ePXpo//79atKkyRUd969//auWLFmiP//5z4qIiNBXX32lvn37luq3fft2bd26VUOHDlWzZs10/PhxvfXWW+rZs6f2798vb29v3XrrrXr88cf1+uuva8qUKQoNDZUk239/Ky8vTz179tSRI0cUHR2t1q1ba/ny5Ro1apQyMzP1xBNP2PWPi4vT+fPn9be//U1OTk566aWXdN999+nnn3+Wm5tbuXP87LPP5OXlpUGDBlXoazJz5kzNmjVLkZGRevjhh3Xo0CG99dZb2r59u7Zs2WJ3rHPnzqlPnz4aOnSoHnjgAQUGBtr2LVq0SPn5+Ro3bpw8PDzk7++vffv26eabb1bTpk01adIk1alTR//5z3/Uv39/rVy5UgMGDCi3ruXLlys3N1cPP/ywGjRooG3btumNN97QqVOntHz5cknS3/72N6WkpGj9+vX64IMPDOe6b98+3XLLLfL19dXTTz8tNzc3vf322+rZs6c2b96sbt262fV/7LHHVL9+fc2YMUPHjx/XnDlzFB0drWXLllXoawsA1YIVAFBlFRcXWxs3bmwNDw+3a1+wYIFVknXdunVWq9Vqzc/Pt5aUlNj1OXbsmNXDw8P63HPP2bVJsi5atMjWNmPGDOuvfx3s3r3bKsn6yCOP2L3fn//8Z6sk64wZM2xtubm5pWpOSEiwSrIuXrzY1rZ8+XKrJOvGjRtL9e/Ro4e1R48etu05c+ZYJVmXLFliayssLLSGh4db69ata83OzrabS4MGDawZGRm2vp9++qlVkvXzzz8vdaxfq1+/vrVjx46X7XNJenq61d3d3XrnnXfafZ3nzZtnlWRduHCh3XwkWRcsWGD3Hpfq9fX1taanp9vt69Wrl7VDhw7W/Px8W5vFYrFGRERYg4ODbW0bN24s9XUs63sQGxtrdXJysp44ccLW9uijj1rL+7X/2+9r//79re7u7tajR4/a2lJSUqw+Pj7WW2+91da2aNEiqyRrZGSk1WKx2NonTJhgdXFxsWZmZpZ5PACojrhUDwCqMBcXFw0dOlQJCQl2l7/FxcUpMDBQvXr1kiR5eHjI2fniX+klJSU6d+6c6tatq2uvvVY7d+68omOuWbNGkvT444/btY8fP75UXy8vL9v/FxUV6dy5c7rmmmtUr169Kz7ur48fFBSkYcOG2drc3Nz0+OOP68KFC9q8ebNd/yFDhqh+/fq27VtuuUWS9PPPP1/2ONnZ2fLx8alQTRs2bFBhYaHGjx9v+zpL0tixY+Xr66vVq1fb9ffw8NDo0aPLfK+BAwcqICDAtp2RkaGvvvpK999/v86fP6+zZ8/q7NmzOnfunKKiovTTTz8pOTm53Np+/T3IycnR2bNnFRERIavVql27dlVofr9WUlKiL7/8Uv3791ebNm1s7Y0bN9af//xnffvtt8rOzrYbM27cOLtL/2655RaVlJToxIkTV3x8AKiqCE4AUMVdWvwhLi5OknTq1Cl98803Gjp0qFxcXCRJFotFr732moKDg+Xh4aGGDRsqICBAe/bsUVZW1hUd78SJE3J2dlbbtm3t2q+99tpSffPy8jR9+nQ1b97c7riZmZlXfNxfHz84ONguoEj/u7Tvt/8Yb9Gihd32pRD1yy+/XPY4vr6+l13q/bc1SaW/Bu7u7mrTpk2pmpo2bVrugg+tW7e22z5y5IisVqumTZumgIAAu9eMGTMkqcx73C5JSkrSqFGj5O/vr7p16yogIEA9evSQpN/1PThz5oxyc3PL/H6HhobKYrHo5MmTdu2/93sAANUJ9zgBQBUXFhamkJAQffTRR5oyZYo++ugjWa1Wu9X0/v73v2vatGl68MEH9fzzz8vf31/Ozs4aP368LBaLw2p77LHHtGjRIo0fP17h4eHy8/OTk5OThg4d6tDj/tql8PhbVqv1suNCQkK0e/duFRYWXvVV7X59Fsho36Wv01NPPaWoqKgyx1xzzTVltpeUlOiOO+5QRkaGnnnmGYWEhKhOnTpKTk7WqFGjqvz3AACqE4ITAFQDw4cP17Rp07Rnzx7FxcUpODhYN954o23/ihUrdNttt+ndd9+1G5eZmamGDRte0bFatmwpi8Wio0eP2p11OHToUKm+K1as0MiRI/Xqq6/a2vLz80utNPfbVfuMjr9nzx5ZLBa7s04HDx607b8a7rnnHiUkJGjlypV2lwWWV5N08Wvw68vXCgsLdezYMUVGRv7uOi69n5ub2xW/z48//qjDhw/r/ffft1uyfv369aX6VvR7EBAQIG9v7zK/3wcPHpSzs7OaN29+RXUCQE3ApXoAUA1cOrs0ffp07d69u9Szm1xcXEp9ur98+fLL3htTnj59+kiSXn/9dbv2OXPmlOpb1nHfeOMNlZSU2LXVqVNHkkoFqrLcddddSk1NtVuRrbi4WG+88Ybq1q1ruwztj3rooYfUuHFjPfnkkzp8+HCp/enp6XrhhRckSZGRkXJ3d9frr79uN993331XWVlZZa44WFGNGjVSz5499fbbb+v06dOl9l9uWe9LZ3p+XZPVatXcuXNL9a3o98DFxUV33nmnPv30U7v76tLS0hQXF6fu3bvL19f3su8BADURZ5wAoBpo3bq1IiIi9Omnn0pSqeB0991367nnntPo0aMVERGhH3/8UR9++KHd2ZGK6tSpk4YNG6Y333xTWVlZioiIUHx8vI4cOVKq7913360PPvhAfn5+ateunRISErRhwwY1aNCg1Hu6uLjon//8p7KysuTh4aHbb79djRo1KvWe48aN09tvv61Ro0YpMTFRrVq10ooVK7RlyxbNmTOnwgs6GKlfv74++eQT3XXXXerUqZMeeOABhYWFSZJ27typjz76SOHh4ZIunoWZPHmyZs2apd69e6tfv346dOiQ3nzzTd1444164IEH/lAt8+fPV/fu3dWhQweNHTtWbdq0UVpamhISEnTq1Klyn8cVEhKitm3b6qmnnlJycrJ8fX21cuXKMu8tujS3xx9/XFFRUbaFR8rywgsvaP369erevbseeeQRubq66u2331ZBQYFeeumlPzRXAKiuCE4AUE0MHz5cW7duVdeuXUvd8zJlyhTl5OQoLi5Oy5YtU+fOnbV69WpNmjTpdx1r4cKFCggI0IcffqhVq1bp9ttv1+rVq0tdojV37ly5uLjoww8/VH5+vm6++WZt2LCh1L06QUFBWrBggWJjYzVmzBiVlJRo48aNZQYnLy8vbdq0SZMmTdL777+v7OxsXXvttVq0aJFGjRr1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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Compute the per-era correlation between our predictions and the target values\n",
    "per_era_corr = validation.groupby(\"era\").apply(lambda x: numerai_corr(x[\"prediction\"], x[\"target\"]))\n",
    "\n",
    "# Plot the per-era correlation\n",
    "per_era_corr.plot(kind=\"bar\", title=\"Validation Correlation\", figsize=(10, 6), xticks=[], snap=False);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Instead of looking at the `corr` score for each era, it is helpful to look at the cumulative `corr`. \n",
    "\n",
    "If you are familiar with \"backtesting\" in quant finance where people simulate the historical performance of their investment strategies, you can roughly think of this plot as a backtest of your model performance over the historical validation period."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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nEyHDh00dOhQTZgwQenp6erRo4cWLVqkhISEEm379++vqVOnKjg4WK1atdLSpUu1cOFC1alTp8Q6PTw89O9//1vp6elyOBy66KKLFBYWVmKdt912myZOnKiRI0dq1apVatSokT7//HP9+uuvev311ytssIzatWtr1qxZuvzyy9WhQwfdeOONiouLkyStXr1an376adFRzdDQUI0bN05PP/20LrvsMg0YMEBbt27VhAkT1KVLF914441nVcvbb7+t888/X23bttXo0aPVpEkTpaSkaOnSpdq7d2+Z90Nq0aKFmjZtqrFjx2rfvn0KCgrSF198Ueq1MSf27b777lPfvn2LBroozXPPPacFCxbo/PPP11133SVPT09NnDhReXl5evHFF89qXwHUQOd8nDcAOIlt27aZ0aNHm0aNGhlvb28TGBhozjvvPPPmm28WGwI3JyfH3HrrrSY4ONgEBgaa66+/3qSmppY5vHRaWlqx7YwYMcL4+/uX2H6vXr1M69ati01LTEw0ffr0MQ6Hw4SHh5tHH33ULFiw4LSGl/7ggw9MbGyscTgcpkWLFmby5MklhlU2xpgtW7aYnj17Gl9fXyOpaKjpsoa3NsaYYcOGFQ2xW5YvvvjCnH/++cbf39/4+/ubFi1amLvvvtts3bq1zGX+7u233zaSTNeuXUvMy83NNQ899JCJjIw0vr6+5rzzzjNLly4tMXTz6QwvbYwxx44dM/fdd5+pU6eO8ff3N1deeaXZs2dPiX49cuSIufnmm03dunVNQECA6du3r9myZYtp2LBhiWG6//vf/5omTZoYDw+PYn329xqNMSYlJaVovd7e3qZt27YlhjE/sS8vvfRSiefj73WezP79+82DDz5omjVrZnx8fIyfn5+Ji4szzz//vElPTy/W9q233jItWrQwXl5eJjw83Nx5553myJEjxdqU9rt7qnqNOf77PXz4cBMREWG8vLxMvXr1TP/+/c3nn39e1Ka04aU3b95s+vTpYwICAkzdunXN6NGjzbp160r0c2Fhobn33ntNaGiosdlsxfq8tOdr9erVpm/fviYgIMD4+fmZCy+80Pz222/F2px4XaxYsaLY9NLqBFBz2Yzhij0AAAAA7oVrdAAAAAC4HYIOAAAAALdD0AEAAADgdgg6AAAAANwOQQcAAACA2yHoAAAAAHA71eKGoS6XS/v371dg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XXWVWb9+vVm/fr0ZOHCg6dKli3E6ncYYY/Ly8kq8544aNco0btzYuFwuYwyfi+fCvHnzzP/93/+ZL7/80kgys2bNKjb/hRdeMMHBwWb27Nlm3bp1ZsCAAaZx48bm2LFjRW34fnNcjQw6Xbt2NXfffXfRz06n00RFRZnx48cbY44Hnfvvv/+015eammq8vLzMRx99VDQtPj7ejB07tli7MWPGmPPOO+/sikeRU/Vjt27dzGOPPXbSdTRs2NC89tprZc4fOnSoufbaa4tN+89//mPq169f9KaPs3Oqfvy7Dh06mFtuueWk63zjjTdM/fr1i37m9Vi5TtWH/v7+xd4fjTEmJCTE/Pe//y2xrsmTJ5cadMaNG2c6d+5cbNpXX31lfHx8TEZGRgXsBc62HydOnGjCwsKKvjQbY8z69euNJLN9+3ZjDP1Y2U7Wh/Pnzzd2u73YH26PHj1qbDabWbBgQanry8/PN6GhoeaZZ54pmsbn4rn196DjcrlMRESEeemll4qmHT161DgcDvPpp58WTeP7zXE17tS1/Px8rVq1Sn369CmaZrfb1adPHy1durRo2ieffKK6deuqTZs2GjdunHJycspc50cffSQ/Pz9de+21RdPy8vLk4+NTrJ2vr6+WL1+ugoKCCtyjmulU/Ziamqply5YpLCxMPXr0UHh4uHr16qVffvmlxLpeeOEF1alTRx07dtRLL71U7BSKsvpx7969SkpKqrwdrCFO9/V4wqpVq7R27VrdeuutZa5z//79+vLLL9WrV6+iabweK8/p9GGPHj302Wef6fDhw3K5XJo+fbpyc3PVu3fv095OWX2Ym5urVatWVci+1GQV0Y95eXny9vaW3f7nVwtfX19JKnrvpR8rz6n6MC8vTzabrdiNJH18fGS320v9bJSkr776SocOHdLNN99cNI3PRWvt3LlTycnJxfo5ODhY3bp1K/G5yfebGniNzsGDB+V0OhUeHl5senh4uJKTkyVJN9xwgz7++GMtXrxY48aN09SpU3XjjTeWuc4PPvhAN9xwQ9EbuiT17dtX77//vlatWiVjjFauXKn3339fBQUFOnjwYOXsXA1yqn7csWOHJOmpp57S6NGj9d1336lTp066+OKLi53Het9992n69OlavHixbr/9dv3rX//Sww8/XDS/b9+++vLLL7Vo0SK5XC5t27ZNr7zyiiTp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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the cumulative per-era correlation\n",
    "per_era_corr.cumsum().plot(kind=\"line\", title=\"Cumulative Validation Correlation\", figsize=(10, 6));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Performance metrics \n",
    "\n",
    "To evaluate the performance of our model, it is also helpful to compute some summary metrics over the entire validation period.\n",
    "\n",
    "`Mean` of correlations is the primary measure of your model's performance.\n",
    "\n",
    "`Sharpe` is a measure of your model's consistency, a concept borrowed from finance where it usually refers to risk adjusted returns of an investment strategy. In Numerai, we compute sharpe as the average correlation divided by the standard deviation of correlations.\n",
    "\n",
    "`Max drawdown` is a measure of your model's risk, another concept borrowed from finance where it usually refers to the maximum financial loss suffered by an investment strategy. In Numerai, we compute max drawdown as the maximum peak to trough drop in cumulative validation correlation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.023100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.022390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sharpe</th>\n",
       "      <td>1.031715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max_drawdown</th>\n",
       "      <td>0.073197</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 Value\n",
       "mean          0.023100\n",
       "std           0.022390\n",
       "sharpe        1.031715\n",
       "max_drawdown  0.073197"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Compute performance metrics\n",
    "corr_mean = per_era_corr.mean()\n",
    "corr_std = per_era_corr.std(ddof=0)\n",
    "corr_sharpe = corr_mean / corr_std\n",
    "max_drawdown = (per_era_corr.cumsum().expanding(min_periods=1).max() - per_era_corr.cumsum()).max()\n",
    "\n",
    "pd.DataFrame({\n",
    "    \"mean\": corr_mean,\n",
    "    \"std\": corr_std,\n",
    "    \"sharpe\": corr_sharpe,\n",
    "    \"max_drawdown\": max_drawdown\n",
    "}, index=[\"Value\"]).T"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "These performance metrics above is not amazing but good enough for us to get started. Don't worry, we will be learning how to improve our model performance in the next tutorials!"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Submissions \n",
    "\n",
    "Unlike Kaggle competitions that evalute models based on <ins>test</ins> performance, Numerai evaluates models based based on <ins>live</ins> performance. \n",
    " \n",
    "### Live predictions\n",
    "\n",
    "Every Tuesday-Saturday, new `live features` are released, which represent the current state of the stock market. \n",
    "\n",
    "Your task is to generate `live predictions` on the unknown target values, which represent stock market returns 20 days into the future."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-10-05 18:05:40,984 INFO numerapi.utils: target file already exists\n",
      "2023-10-05 18:05:40,986 INFO numerapi.utils: starting download\n",
      "v4.2/live_int8.parquet: 11.8MB [00:00, 36.5MB/s]                   "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] Accuracy may be bad since you didn't explicitly set num_leaves OR 2^max_depth > num_leaves. (num_leaves=31).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>prediction</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n000dfda7b9b8411</th>\n",
       "      <td>0.487899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0010b53bde75145</th>\n",
       "      <td>0.496803</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n001d1d793479eea</th>\n",
       "      <td>0.486529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00201278f52cf79</th>\n",
       "      <td>0.504210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00201a63fafb0f7</th>\n",
       "      <td>0.489760</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nff8a3a513cf114b</th>\n",
       "      <td>0.506473</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nff8d5900f549d76</th>\n",
       "      <td>0.487958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffb2dd817c8dcfe</th>\n",
       "      <td>0.512551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff3128ce036fca</th>\n",
       "      <td>0.512227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff90727ed32b45</th>\n",
       "      <td>0.487056</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4827 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                  prediction\n",
       "id                          \n",
       "n000dfda7b9b8411    0.487899\n",
       "n0010b53bde75145    0.496803\n",
       "n001d1d793479eea    0.486529\n",
       "n00201278f52cf79    0.504210\n",
       "n00201a63fafb0f7    0.489760\n",
       "...                      ...\n",
       "nff8a3a513cf114b    0.506473\n",
       "nff8d5900f549d76    0.487958\n",
       "nffb2dd817c8dcfe    0.512551\n",
       "nfff3128ce036fca    0.512227\n",
       "nfff90727ed32b45    0.487056\n",
       "\n",
       "[4827 rows x 1 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Download latest live features \n",
    "napi.download_dataset(\"v4.2/live_int8.parquet\")\n",
    "\n",
    "# Load live features\n",
    "live_features = pd.read_parquet(f\"v4.2/live_int8.parquet\", columns=feature_cols)\n",
    "\n",
    "# Generate live predictions\n",
    "live_predictions = model.predict(live_features[feature_cols])\n",
    "\n",
    "# Format submission\n",
    "pd.Series(live_predictions, index=live_features.index).to_frame(\"prediction\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Model upload\n",
    "\n",
    "To participate in the tournament, you must submit live predictions every Tuesday-Saturday. \n",
    "\n",
    "To automate this process, you can simply:\n",
    "- Define your prediction pipeline as a function\n",
    "- Serialize your function using the `cloudpickle` library\n",
    "- Upload your model pickle file to Numerai\n",
    "- Let Numerai run your model to submit live predictions every day\n",
    "\n",
    "Read more about Model Uploads and other self-hosted automation options in our [docs](https://docs.numer.ai/numerai-tournament/submissions#automation).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define your prediction pipeline as a function\n",
    "def predict(live_features: pd.DataFrame) -> pd.DataFrame:\n",
    "    live_predictions = model.predict(live_features[feature_cols])\n",
    "    submission = pd.Series(live_predictions, index=live_features.index)\n",
    "    return submission.to_frame(\"prediction\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Use the cloudpickle library to serialize your function\n",
    "import cloudpickle\n",
    "p = cloudpickle.dumps(predict)\n",
    "with open(\"predict.pkl\", \"wb\") as f:\n",
    "    f.write(p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Download file if running in Google Colab\n",
    "try:\n",
    "    from google.colab import files\n",
    "    files.download('predict.pkl')\n",
    "except:\n",
    "    pass"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's it! You now have a pickle file that is ready for upload.\n",
    "\n",
    "Head back to the [Hello Numerai Tutorial](https://numer.ai/tutorial/hello-numerai) to upload your model! "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
